import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

print("----------------基本属性----------------")
# shape:形状(各维度的长度)
cat = plt.imread("cat.jpg")
print(cat.shape)

# ndim:维度数
print(cat.ndim)

# size:总数据量
print(cat.size)

# dtype:数据类型
print(cat.dtype)

print("----------------索引----------------")
# 在一维的情况下跟列表操作索引完全一致
l = [1,2,3,4,5,6]
n = np.array(l)
print(n[0],n[-1])

# 二维
n = np.random.randint(0,10,size=(4,5))
print(n[3][4], n[-1][-1])

# 三维
n = np.random.randint(0,100,size=(4,5,6))
print(n)
print(n[1,1,1])

# 根据索引修改数据
n[-1,-1,-1] = 88

# 大范围修改
n[1,2] = 100
print(n)

print("----------------切片----------------")
# 普通列表的切片操作
l=[1,2,3,4,5,6,7,8,9]
# 从索引2到索引6
print(l[2:6])
# 翻转
print(l[::-1])

# numpy的一维数组切片操作
n = np.array(l)
print(n[2:6])
print(n[::-1])

# 二维
n = np.random.randint(0,10,size=(6,8))
print(n)
# 取一行
print(n[0])
# 取连续多行
print(n[1:4])
# 取不连续的多行
print(n[[1,2,4]])

# 取一列 二维数组的1到4行的第0列
print(n[1:4,0])
# 取连续多列
print(n[: , 2:5])
# 取不连续多列
print(n[:, [1,3,4]])

print("--------------------------------将cat.jpg的图片翻转--------------------------------")
cat = plt.imread("cat.jpg")
print(cat.shape)
# 行翻转（上下翻转)
plt.imshow(cat[::-1])
# 列翻转（左右翻转
plt.imshow(cat[:,::-1])
# 对颜色翻转
plt.imshow(cat[:,:,::-1])

print("--------------------------------变形--------------------------------")
n = np.arange(1,21)
# 将一维数组变为二维4行5列
n2 = np.reshape(n,(4,5))
print(n2)
# 还原成一维数组
n3 = np.reshape(n,20)
print(n3)

# 使用-1去自动匹配剩余的维度
n3 = np.reshape(n,(4,-1))
print(n3)
n3 = np.reshape(n,(5,-1))
print(n3)
n3 = np.reshape(n,(2,-1))
print(n3)
n3 = np.reshape(n,(2,-1,2))
print(n3)

print("--------------------------------级联--------------------------------")
n1 = np.random.randint(0,100,size=(3,5))
n2 = np.random.randint(0,100,size=(3,5))
# 默认上下合并
print(np.concatenate((n1,n2)))
# axis=1为列合并
print(np.concatenate((n1,n2),axis=1))
# 另一种写法的水平，垂直合并
print(np.vstack((n1,n2)))
print(np.hstack((n1,n2)))

print("--------------------------------拆分--------------------------------")
n = np.random.randint(0,100,size=(6,4))
print(n)

# 开始拆分n,水平平均拆成3份
print(np.vsplit(n,3))
# 水平不平均拆分
print(np.vsplit(n,(1,2,4)))
# 垂直拆分
print(np.hsplit(n,2))

# 使用spilt默认按行来拆分
print(np.split(n,2))
# 水平拆分
print(np.split(n,2,axis=1))

print("--------------------------------拷贝--------------------------------")
# 深拷贝
n1 = np.arange(10)
# n2拷贝n1
n2 = n1.copy()
n2[0] = 99
print(n1)
print(n2)
